热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

可能会|也就是_TCP:当初取代NCP,如今害怕被取代

篇首语:本文由编程笔记#小编为大家整理,主要介绍了TCP:当初取代NCP,如今害怕被取代相关的知识,希望对你有一定的参考价值。我叫TCP(Transmiss

篇首语:本文由编程笔记#小编为大家整理,主要介绍了TCP:当初取代NCP,如今害怕被取代相关的知识,希望对你有一定的参考价值。


我叫TCP(Transmission Control Protocol)也叫传输控制协议。不觉回忆1983年,亲手将NCP协议淘汰,取而代之的是我,成了火遍大江南北的网络红人之一。


现如今,我感受到前所未有的恐惧,因为我一生的敌人UDP正在赶超我,甚至将我取而代之。



我的生平


我在1974年被我的父亲罗伯特·卡恩和温特·瑟夫设计出来,和我一同出生的也是如今的网络红人IP,我们是一对亲密无间的组合——TCP/IP,我在网络七层模型里的4层——传输层,而IP兄弟是负责网络层。


我的作用就是负责传输数据,并代替NCP协议的工作,因为它不能跨系统通讯,怎么说呢,就是如果大家用了Windos操作系统,就没法和MacOs操作系统进行通讯,这非常不利于互联网的发展,我很抱歉NCP一时被抛弃,但是我们依然坚信“物竞天择,适者生存”的道理。


起初出生时,我们并没有大家想象的那么容易。刚出生时的我是非常简陋的,我的IP兄弟负责每个机器分配一个IP地址标识。IP兄弟像是为我铺好了康庄大道,而我只需要将数据包运输到目的地。而我们也比较争气,我的父亲卡恩和瑟夫为我做了一个实验,将一个数据包从一端发出,经过10万千米的旅程后到达服务端。这个传输过程,数据包没有丢失一个字节!


但是,我们的命运和其他伙伴一样,新技术或新标准起初总是会受到强烈的抵制。特别是标准化组织ISO推出了著名的ISO七层模型,那时我又被强烈的鄙视了一番。


不得不说,父爱是伟大的,他们经过4年时间的不断对我们改进,为我和IP兄弟完成了基础框架的搭建。


尽管阻碍重重,我的父亲卡恩和瑟夫进行了长期的斗争。


终于,在1983年被美国国防部高级研究计划局决定淘汰NCP协议,我和IP兄弟取而代之。


这个过程,整整过去了10年的时间。我和我的亲兄弟IP终于站稳了脚跟,分别负责七层模型里的传输层,网络层。


现如今,接触计算机的朋友们对我一定不陌生。我在网络中扮演着重要角色,你们发送的信息基本上都是我在负责的,每时每刻都在处理成千上万用户的信息,还要安全且无误的传输到指定的地方。


这时候你可能反应过来了,你用手机,电脑等设备对你恋人或者亲人说的话,语音,视频都是我负责帮你们成功抵达,而且是准确无误,因为至今正常情况下我没有收到你们错误信息的抱怨。


我可以自信地说是印度洋和太平洋之间重要枢纽——马六甲海峡。


当然我的亲兄弟IP也是功不可没,它为我连通了各个设备搭建好了桥梁,那么我根据IP我就能找到准确的人给他发送。而且还划分了网段,这样你在浙江给在北京的爱人发信息,那我一定是往北走,而不是往西,或者往南走。


你可能会好奇,我是怎么做到每时每刻处理成千上万的信息安全且无误地传输到目的地。这得归因于我父亲对我的设计了,他们致力于让我成为一个安全且靠谱的“运输卡车”。


三次握手机制


第一次握手,做了什么?


这第一个安全的设计,就是连接机制,为了确保能够建立正确的连接,大部分情况下我需要三次连接才能建立安全可靠的传输通道。也就是你们常说的“三次握手”连接。


首先客户端要和服务端建立TCP连接,也就是建立通讯管道。会先发一个SYN报文,这是一个请求同步连接的报文,发送之后此时的客户端会进入到SYN-SENT状态。


如果客户端迟迟收不到服务端的SYN-ACK(同步应答)报文,就会触发超时重传机制,重新把刚才的SYN报文重新发送,而且重传的SYN报文的序列号都是一样的。


你可能会好奇客户端没有收到应答之后,多久才会触发重传且需要重传几遍才肯罢手。


不同版本的操作系统可能超时时间不同,有的 1 秒的,也有 3 秒的,这个超时时间是写死在内核里的,如果想要更改则需要重新编译内核,比较麻烦。


在 Linux 里,客户端的 SYN 报文最大重传次数由 tcp_syn_retries 内核参数控制,这个参数是可以自定义的,默认值一般是 5,所以这个可以是由操作系统来设定的。


假如我们设置初始超时重传1秒,最大重传次数为5次。那么客户端第一次超时重传是在1秒,第二次超时重传是在2秒,第三次超时重传是在4秒,第四次超时重传是在8秒,第五次超时重传是在16秒。我们可以看到规律,每次超时时间是上一次的2倍。


当到了第五次重传时,将继续等待32秒之后服务端还是没有响应ACK,客户端将不再发送SYN包,然后断开TCP连接。



▲图/ 第一次握手超时重传机制


第二次握手,做了什么?


第二次握手,也就是客户端发送的SYN报文,如果服务端收到了就会返回一个SYN-ACK报文给客户端,并且服务端进入SYN_RCVD(同步已接收)状态。


此时的SYN-ACK报文做了两件事,一件是对第一次握手时做个回应确认报文已经收到。另一个是服务器既然收到了便会发起建立TCP通信管道的连接的报文,这个地方是一个发送请求时间,如果没有得到ACK回应则会触发超时重传机制。


此时,如果服务端的SYN_ACK报文发送了之后,如果丢失或者某种原因导致客户端没有收到,只要客户端没有接收到就会触发超时重传机制(会有计时器,超过时间没接收到就重传),重传SYN报文。


当然为了确保稳定,不仅客户端会有重传机制,服务器也会有超时重传机制,重发SYN-ACK报文。


在 Linux 下,SYN-ACK 报文的最大重传次数由 tcp_synack_retries内核参数决定,默认值是 5。



▲图/ 第二次握手超时重传机制


第三次握手,做了什么?


这个时候,客户端收到服务端的ACK应答报文并发起了TCP建立连接请求,此时客户端收到并对TCP建立连接得请求发送一个ACK应答报文,并且客户端进入ESTABLISH的建立连接状态。


我们可以看到此时的第三次握手是基于第二次握手服务端发来的SYN的确认报文,如果客户端没有收到,那么服务端此时会触发超时重传机制,进行重发相同的ACK报文。



▲图/ 第三次握手超时重传机制


由此,我们也可以总结出结论,ACK应答报文并不会有重传机制,当ACK丢失了,由对方发来的SYN报文进行重传。


以上就是我的建立连接机制了。你们可能会看起来比较麻烦,特别是当今世界如果聊天出现了三次握手的情况,你们一定是不耐烦的。然而,我这是牺牲了一定的速度来确保安全以及稳定的作用,我想人们更多情况下都是求安全且稳定的。



四次挥手机制




我虽然在一定程度上具有传统且保守的态度,但是我一定是力争求稳,且有始有终,是你们靠谱的伙伴。所以,在传输结束时,我也有一套安全稳定的断联机制。就是你们俗称的“四次挥手”。


第一次挥手,做了什么?


第一次挥手,当客户端所有的消息都发送完之后,会主动调用close函数,然后向服务器发送FIN(完成)报文,试图和服务器断开连接,并且状态进入到FIN_WAIT_1状态。


客户端不管何种情况,只要没有收到ACK报文,就会触发超时重传机制,重传FIN报文,重传次数也是由操作系统 tcp_orphan_retries 参数设置。



▲图/ 第一次挥手超时重传机制


超时重传到达 tcp_orphan_retries 的次数之后,就不再发送FIN报文,则会等待上一段时间的2倍之后还是没有收到,则直接进入close状态。


第二次挥手,做了什么?


第二次挥手,服务端收到客户端的第一次挥手之后会回传一个ACK确认报文,此时服务端的状态进入到CLOSE_AWAIT状态。


由于ACK报文是没有重传机制的,所以一旦服务端没有把ACK回传给客户端且接收到,则由客户端发送方来触发超时重传机制。这也是一问一答式的,必须有问有答才算一回合结束。



▲图/ 第二次挥手超时重传机制


客户端收到ACK报文,则状态由FIN_WAIT_1变为FIN_WAIT_2的状态。这个状态需要等待服务端发送第三次挥手,也就是服务端的FIN报文。


这里,客户端收到ACK进入到FIN_WAIT_2状态之后,调用close关闭函数,之后便无法再发送和接收数据,所以这个FIN_WAIT_2状态也不会持续很长,而 tcp_fin_timeout 控制了这个状态下连接的持续时长,默认值是 60 秒。



▲图/ close函数关闭机制


意味着如果在60秒后还没有收到FIN报文,客户端的连接就会直接关闭。


但是如果客户端(主动方)关闭使用shutdown函数代替close函数关闭连接时,指定了只关闭发送方,而接收方并没有关闭,那么主动关闭方还是可以接收数据的。


服务端(接收方)还在处于接收状态就无法发送FIN报文,那么客户端(主动方)就会一直处于FIN_WAIT_2状态,你可能会想tcp_fin_timeout这个时间倒计时可以主动关闭状态。很遗憾,tcp_fin_timeout这个参数只对close函数有用,对shutdown函数无效,并会处于一直等待中,没有杀死这个线程甚至可能死等中。这是一个不到万不得已的下策。



▲图/ shutdown函数关闭机制


第三次挥手,做了什么?


到了这里,进入到第三次挥手。在上一轮服务端进入CLOSE_WAIT状态后,进程主动调用close函数进入到内核,内核会发送一个FIN报文,同时进入LAST_ACK状态,等待客户端返回ACK来确认连接关闭。



▲图/ 第三次挥手超时重传机制


这里,如果迟迟收不到客户端返回的ACK报文,则依然会触发重传机制,重发次数仍然由tcp_orphan_retries 参数控制。


第四次挥手,做了什么?


服务端发送了FIN报文之后,就进入到第四次挥手了。当客户端收到服务端的第三次挥手的FIN报文之后,就会回传一个ACK报文,也就是第四次挥手,并且进入到TIME_WAIT 状态。


TIME_WAIT状态根据操作系统的不同,一般Linux系统是持续2MSL(2倍的最大生存时间)进入关闭状态。



▲图/ 第四次挥手超时重传机制


服务端若没有收到客户端发来的ACK报文,则依然处于LAST_ACK状态。超时未接收到则客户端会触发超时重传FIN报文,重发次数仍然由前面介绍过的 tcp_orphan_retries 参数控制。


时代的眼泪


你看,这是我有始有终的机制,对于我来说,每一步都不是多余,都是为了双方能够建立安全稳定的通道,不会在错重复杂的通讯管道中将数据错误的传达。


当然,这些是我在连接和断开方向上的主要特点。我的主要功能不仅这些, 重传、滑动窗口、流量控制、拥塞控制都是我的一套完整的高可用体系。


在我和应用层HTTP组合已经有四十年左右,在此期间我可以是撑起整个互联网的元老之一,毫不夸张的自诩为互联网的血脉。但是也难挡时代带来的风霜,我有一个死对手UDP,这个将是我永远过不去的坎,以前我从没觉得它能够赶超我甚至替代我,它的好处就是快,靠不靠谱我不说。


但是随着时代的发展,人们对于速度的要求越来越高,人们不断地改良网络模型,我的兄弟也在升级,已经有了IPv6,而与我患难与共的HTTP,则是不断的从1.0优化到了3.0,这个版本的出现彻底的让我感到emo,因为http3.0版本已经使用我的死对头来替换了我,他们将UDP的速度发挥起来,并且对于安全连接和数据校验相关做了很好的控制。


这也是我为什么要开始emo和吐槽了。


👇 更多有趣内容,请多关注!👇


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • SQL Server 内存中OLTP内部机制概述(一)
    内存中OLTP(项目名为“Hekaton”)是一个新的完全集成到SQLServer中的数据库引擎组件。它专为访问内存常驻数据的OLTP工作负荷而进行优化。内存中OLTP有助于OLT ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 如何使用代理服务器进行网页抓取?
    本文介绍了如何使用代理服务器进行网页抓取,并探讨了数据驱动对竞争优势的重要性。通过网页抓取,企业可以快速获取并分析大量与需求相关的数据,从而制定营销战略。同时,网页抓取还可以帮助电子商务公司在竞争对手的网站上下载数百页的有用数据,提高销售增长和毛利率。 ... [详细]
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
  • Ansem 最新雄文:软着陆后,加密市场下阶段趋势与核心叙事
    市场最糟糕的时候已经过去,以太坊合并前不太会看到新的低点;但仍需来自关注宏观市场的不确定风险。撰文:Ansem ... [详细]
author-avatar
mobiledu2502929627
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有